package com.nuanshui.heatedloan.middleware.msgcenter.util;

import java.lang.reflect.Method;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.nuanshui.heatedloan.middleware.msgcenter.MethodMsgParamsEndPoint;
import com.nuanshui.heatedloan.middleware.msgcenter.MsgParamsEndPoint;
import com.nuanshui.heatedloan.middleware.msgcenter.MsgParamsEndpointRegistrar;
import com.nuanshui.heatedloan.middleware.msgcenter.bean.Model;

/**
 * 此类主要通过反射调用  消息参数处理的方法
 * @param 
 * @author guohao
 * @date 2017年2月10日 上午10:59:37
 * @since $
 */
public class MsgParamsUtil {
	
	private Logger logger = LoggerFactory.getLogger(MsgParamsUtil.class);
	private static  MsgParamsEndpointRegistrar registrar = new MsgParamsEndpointRegistrar();	
    @SuppressWarnings("rawtypes")
    /**
     * 判断此节点是否有效
     * @param @param msgParamsEndPoint
     * @param @return
     * @author guohao
     * @date 2017年2月10日 上午11:11:15
     * @since $
     */
	public static  boolean  verifyMethodParams(MsgParamsEndPoint msgParamsEndPoint) {
		if(msgParamsEndPoint == null) return false;
		if(msgParamsEndPoint instanceof MethodMsgParamsEndPoint) { //判断定义的方法是否正确
			MethodMsgParamsEndPoint methodMsgParamsEndPoint = (MethodMsgParamsEndPoint) msgParamsEndPoint;
		    Method method =   methodMsgParamsEndPoint.getMethod();  
			Class[] paramTypes =  method.getParameterTypes();
		    if(paramTypes.length!=1) return false;
		    Class paramType =  paramTypes[0];
		    return Model.class.isAssignableFrom(paramType);
		}	
		return true;
		
	}
    
    /**
     * 注册一个处理的节点
     * @param @param key
     * @param @param msgParamsEndPoint
     * @author guohao
     * @date 2017年2月10日 上午11:01:00
     * @since $
     */
    public static void addEndpoint(String key,MsgParamsEndPoint msgParamsEndPoint) {
    	  if(StringUtils.isEmpty(key)) return ;
    	  if(!verifyMethodParams(msgParamsEndPoint)) return ; 
    	  if(registrar.hasContains(key)) return ;
    	  registrar.register(key, msgParamsEndPoint);
    }
    
    
    /**
     * 调用处理参数的方法
     * @param @param key
     * @param @param model
     * @author guohao
     * @date 2017年2月10日 上午11:48:09
     * @since $
     */
    public static  void  handlerMsgParams(String key ,Model model) {
    	   System.out.println(registrar.hasContains(key));
    	   if(!registrar.hasContains(key))  return ;
    	   registrar.get(key).invokeHandlerMethod(model);
    }
    
    
    
}
